package com.pearadmin.pro.common.utils.upload;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

/**
 * 服务器文件以流的形式下载
 *
 * @author ZhouXingYun
 * @date 2021年04月07日 上午 09:26
 */
@Component
@Repository
public class DownLoadUtils {
    /**
     * 下载导出文件
     * 如果是Excel字节数组可以搭配 ExcelOperationExample 类获取
     *
     * @param fileName  导出文件名，必须带后缀格式 例如: .xlsx
     * @param fileBytes 数据字节数组,如果是Excel需要依赖于POI转换生成的文件字节数组,具体是什么数据看具体实际情况,只要传过来文件的字节数组就行
     * @param response  响应对象
     */
    public void downloadFile(String fileName, byte[] fileBytes, HttpServletResponse response) {
        ServletOutputStream outputStream = null;
        try {
            // 设置响应头
            response.setHeader("Content-Disposition", "attachment;fileName*=UTF-8''" + URLEncoder.encode(fileName, "UTF-8"));
            // 获取输出流
            outputStream = response.getOutputStream();
            // 写出字节流（因为设置了相应头 所有会以文件的形式下载出去）
            // 导出路径看客户端具体设置和选择
            outputStream.write(fileBytes);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

    /**
     * @param file 文件对象
     * @return 文件对象的字节数组
     * @description 将指定 file对象 转换为字节数组
     * @author YangMiao
     * @date 2020/12/1 14:03
     */
    public byte[] fileToByteArray(File file) throws IOException {
        try (ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length())) {
            BufferedInputStream in = null;
            in = new BufferedInputStream(new FileInputStream(file));
            int buf_size = 1024;
            byte[] buffer = new byte[buf_size];
            int len = 0;
            while (-1 != (len = in.read(buffer, 0, buf_size))) {
                bos.write(buffer, 0, len);
            }
            return bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
//            return null;
            throw e;
        }

    }
}
